import { getDebugFeatureValue, useDebugFeatureValue } from "~/atoms/debug-feature"
import { getServerConfigs, useServerConfigs } from "~/atoms/server-configs"
import { featureConfigMap } from "~/lib/features"

// 定义调试功能值的结构
// __override标志用于强制覆盖服务器配置
interface DebugFeatureValue {
  __override?: boolean
  [key: string]: boolean | undefined
}

// 定义功能键类型，限制为featureConfigMap中的键名
export type FeatureKey = keyof typeof featureConfigMap

/**
 * 核心功能检查逻辑，避免代码重复
 * @param feature - 功能键名称
 * @param debugFeatureValue - 调试功能值配置
 * @param serverConfigs - 服务器配置
 * @returns 该功能是否启用
 */
const checkFeatureEnabled = (
  feature: FeatureKey,
  debugFeatureValue: DebugFeatureValue,
  serverConfigs: ReturnType<typeof getServerConfigs>,
): boolean => {
  // 检查是否启用了调试覆盖模式
  const override = !!debugFeatureValue.__override

  // 如果启用了调试覆盖，则使用调试值
  if (override) {
    const debugValue = !!debugFeatureValue[feature]
    return debugValue
  }

  // 获取对应服务器配置键名
  const serverConfigKey = featureConfigMap[feature]

  // 检查服务器配置是否启用了该功能
  const serverEnabled = !!(serverConfigKey && serverConfigs?.[serverConfigKey])

  return serverEnabled
}

/**
 * React Hook: 检查特定功能是否启用
 * 在组件中使用，遵循React Hook规则
 * @param feature - 功能键名称
 * @returns 该功能是否启用
 */
export const useFeature = (feature: FeatureKey): boolean => {
  // 获取调试功能值
  const debugFeatureValue = useDebugFeatureValue() as DebugFeatureValue
  // 获取服务器配置
  const serverConfigs = useServerConfigs()

  // 调用核心检查逻辑
  const isEnabled = checkFeatureEnabled(feature, debugFeatureValue, serverConfigs)

  return isEnabled
}

/**
 * 非Hook函数: 检查特定功能是否启用
 * 可在非React组件环境使用，如路由loader函数
 * 在index.sync.tsx的重定向逻辑中使用
 * @param feature - 功能键名称
 * @returns 该功能是否启用
 */
export const getFeature = (feature: FeatureKey): boolean => {
  // 获取调试功能值（非Hook方式）
  const debugFeatureValue = getDebugFeatureValue() as DebugFeatureValue
  // 获取服务器配置（非Hook方式）
  const serverConfigs = getServerConfigs()

  // 调用核心检查逻辑
  const isEnabled = checkFeatureEnabled(feature, debugFeatureValue, serverConfigs)

  return isEnabled
}
